// internal/router/registry.go
package router

import (
	"star-go-app/internal/apps"
	"star-go-app/pkg/core"
	"star-go-app/pkg/infra/logger"

	"go.uber.org/zap"
)

// ModuleRegistry 模块注册器
type ModuleRegistry struct {
	app *core.Application
}

// NewModuleRegistry 创建模块注册器
func NewModuleRegistry(app *core.Application) *ModuleRegistry {
	return &ModuleRegistry{
		app: app,
	}
}

// RegisterAllModules 自动注册所有已安装的应用模块
func (mr *ModuleRegistry) RegisterAllModules() {
	logger.GetLogger().Info("开始自动注册应用模块...")

	installedApps := apps.GetInstalledApps()
	successCount := 0

	for _, appInfo := range installedApps {
		if err := mr.registerApp(appInfo); err != nil {
			logger.GetLogger().Error("注册应用失败",
				zap.String("app", appInfo.Name()),
				zap.String("description", appInfo.Description),
				zap.Error(err))
		} else {
			successCount++
		}
	}

	logger.GetLogger().Info("应用模块注册完成",
		zap.Int("total", len(installedApps)),
		zap.Int("success", successCount))
}

// registerApp 注册单个应用
func (mr *ModuleRegistry) registerApp(appInfo apps.AppInfo) error {
	logger.GetLogger().Info("正在注册应用",
		zap.String("app", appInfo.Name()),
		zap.String("description", appInfo.Description))

	// 创建模块实例
	module := appInfo.NewModule()

	// 注册模块
	mr.app.RegisterModule(module)

	logger.GetLogger().Info("应用注册成功",
		zap.String("app", appInfo.Name()),
		zap.String("module", module.Name()))

	return nil
}

// GetInstalledApps 获取已安装的应用列表
func GetInstalledApps() []string {
	return apps.GetAppNames()
}

// IsAppInstalled 检查应用是否已安装
func IsAppInstalled(appName string) bool {
	return apps.IsAppInstalled(appName)
}

// GetAppInfo 获取应用详细信息
func GetAppInfo(appName string) (*apps.AppInfo, error) {
	return apps.GetAppByName(appName)
}

// ListAllApps 列出所有已安装的应用信息
func ListAllApps() []apps.AppInfo {
	return apps.GetInstalledApps()
}
